/**
 * @file utils/apiRequest
 * @author zhangxinyue
 */

import 'whatwg-fetch';
import { message } from 'antd';
import config from './config';
// import store from '../index'
import { getDvaApp } from 'umi';
import { redierctLogin } from './commonFunc';

let timer = null;
// 处理接口返回的状态码
function checkStatus(response) {
  // 判断调用接口是否有401或超时，移除message弹窗，只展示一个弹窗
  if (sessionStorage.getItem('prevent') == 1) {
    const messageNode = document.getElementsByClassName('ant-message');
    const { length } = messageNode;
    for (let i = 0; i < length; i++) {
      messageNode[i].innerHTML = '';
    }
    sessionStorage.removeItem('prevent');
  }
  // const { dispatch } = store;
  const { _store } = getDvaApp();
  const { dispatch } = _store;
  // 外网无权限判断 cookie过期 跳转到登录页
  if (response.headers.get('Ag-Code') == '10004' || response.headers.get('Ag-Code') == '13002') {
    redierctLogin(); // 设置重定向到登录页面
    dispatch({
      type: 'login/logout',
    });
    return;
  }

  // 请求正常返回
  if (response.status >= 200 && response.status < 300) {
    return response;
  }
  // 无权限，直接返回登录页面，无response 302也是无权限
  if (response.status === 403 || response.status === 401) {
    redierctLogin(); // 设置重定向到登录页面
    sessionStorage.setItem('prevent', 1);
    dispatch({
      // 进行单纯的登出操作
      type: 'login/logout',
    });
    message.config({
      maxCount: 1,
    });
    message.destroy();

    if (timer) {
      clearTimeout(timer);
    }

    timer = setTimeout(() => {
      message.destroy();
      message.error('请重新登录系统！');
      setTimeout(() => {
        sessionStorage.removeItem('prevent');
      }, 1000);
    }, 1000);
    return;
  }

  // 服务器端异常
  if (response.status === 500 || response.status === 502) {
    throw new Error('服务器异常！');
  }

  // 处理其他无法预知的错误
  const error = new Error(response.statusText);
  error.response = response;
  throw error;
}

// 将结果转换成JSON格式，传出
function parseJSON(response) {
  if (response === undefined) return;

  return response
    .clone()
    .json()
    .then((res) => {
      return res;
    })
    .catch((e) => {
      return response.clone().text();
    });
}

export default function request(url, options) {
  // 请求超时时间设置的是10分钟
  return Promise.race([
    fetch(url, {
      credentials: 'include', // 为了让浏览器发送包含凭据的请求（即使是跨域源）
      ...options,
    })
      .then(checkStatus)
      .then(parseJSON)
      .catch((e) => {}),
    new Promise((rosolve, reject) => {
      // eslint-disable-line
      setTimeout(() => reject('请求超时'), config.timeout);
    }),
  ]);
}
